package fdupc.string;

import net.sourceforge.pinyin4j.PinyinHelper;
import org.apache.commons.lang3.StringUtils;

import java.io.*;
import java.security.MessageDigest;
import java.util.Random;
import java.util.UUID;

/**
 * 类描述:  字符串处理工具
 *
 * @author 王雷
 * @version 1.0.0
 * @date 2022/9/28 0028 下午 5:06
 */
public class StringManagerUtil {

    /**
     * 例如：StringUtil.MD5("richer") 生成：43091a5955ffeb31300b99c81bf90094
     * <p>
     * 把字符串转换成MD5，使用于加密
     *
     * @param origin 字符串
     * @return 处理结果
     */
    public static String giveMd5(String origin) {
        String resultString = null;

        try {
            resultString = origin;
            MessageDigest md = MessageDigest.getInstance("MD5");
            resultString = byteArrayToHexString(md.digest(resultString
                    .getBytes()));
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return resultString;
    }

    /**
    * 功能名称: 空字符串转换
     * @param value 需要判断的字符串
    * @return 处理后的结果
    * @description: 如果字符串为Null，输出返回"";
    * @author: XXSD
    * @date: 2023-08-25 20:35
    */
    public static String giveStrIsNot(String value){
        return StringUtils.isEmpty(value) ? "" : value;
    }

    /**
     * 功能描述：字节十六进制转字符串
     *
     * @date: 2022/9/28 0028 下午 5:08
     */
    private static String byteArrayToHexString(byte[] b) {
        StringBuilder resultSb = new StringBuilder();
        for (byte b1 : b) {
            resultSb.append(byteToHexString(b1));
        }
        return resultSb.toString();
    }

    private final static String[] HEX_DIGITS = {"0", "1", "2", "3", "4", "5",
            "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"};

    /**
     * 功能描述：字节转字符串
     *
     * @date: 2022/9/28 0028 下午 5:08
     */
    private static String byteToHexString(byte b) {
        int n = b;
        if (n < 0) {
            n = 256 + n;
        }
        int d1 = n / 16;
        int d2 = n % 16;
        return HEX_DIGITS[d1] + HEX_DIGITS[d2];
    }

    /**
     * 例如：StringUtil.randomNum(5) 生成：06512
     * <p>
     * 生成一个指定长度的随机数，使用于做文件名
     *
     * @param length 生成的长度
     * @return 处理后的结果
     */
    public static String randomNum(int length) {
        if (length < 1) {
            return null;
        }
        StringBuilder randBuffer = new StringBuilder();
        for (int i = 0; i < length; i++) {
            randBuffer.append(new Random().nextInt(9));
        }
        return randBuffer.toString();
    }

    /**
     * 生成一个指定长度的随机数，使用于做文件名
     *
     * @param length 生成的长度
     * @return 处理后的结果
     */
    public static String randomStr(int length) {
        String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        Random random = new Random();
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < length; i++) {
            int number = random.nextInt(62);
            sb.append(str.charAt(number));
        }
        return sb.toString();
    }

    /**
     * 根据传入的数据进行编码处理，用于生成单据号
     *
     * @return 处理后的结果
     * @author 王雷    (2019年1月5日 上午10:44:12)
     */
    public static String createOrderIdByUUId(String titleChar, String code) {
        int hashCodeV = code.hashCode();
        if (hashCodeV < 0) {
            hashCodeV = -hashCodeV;
        }
        // 0 代表前面补充0
        // 15 代表长度为15
        // d 代表参数为正数型
        return titleChar + String.format("%015d", hashCodeV);
    }

    /*public static void main(String[] values){
        final String s = randomNum(5);
        System.out.println("xxsd-" + createOrderIdByUUId(s, s));
    }*/

    /**
     * 获取UUID数据
     *
     * @return 结果
     */
    public static String giveUuid() {
        UUID uuid = UUID.randomUUID();
        String str = uuid.toString();
        // 去掉"-"符号
        return str.substring(0, 8) + str.substring(9, 13)
                + str.substring(14, 18) + str.substring(19, 23)
                + str.substring(24);
    }

    /**
     * 获取UUID数据
     *
     * @return 结果
     */
    public static String giveUuidAddInitial(String initial) {
        initial = (initial == null) ? "" : initial;
        return initial + giveUuid();
    }

    /**
     * 得到中文首字母（测试仪 -> CSY）
     *
     * @param str 需要转化的中文字符串
     * @return 大写首字母缩写的大写字符串
     */
    public static String givePinYinHeadChar(String str) {
        StringBuilder convert = new StringBuilder();
        for (int j = 0; j < str.length(); j++) {
            char word = str.charAt(j);
            String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(word);
            if (pinyinArray != null) {
                convert.append(pinyinArray[0].charAt(0));
            } else {
                convert.append(word);
            }
        }
        return convert.toString().toUpperCase();
    }

    /**
    * 功能名称:
     * @param e
    * @return
    * @description:
    * @author: XXSD
    * @date: 2023-08-22 23:58
    */
    public static String giveExceptionToString(Exception e) throws IOException {
        //读取异常堆栈信息
        ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();
        e.printStackTrace(new PrintStream(arrayOutputStream));
        //通过字节数组转换输入输出流
        BufferedReader fr = new BufferedReader(new InputStreamReader(new ByteArrayInputStream(arrayOutputStream.toByteArray())));
        String str;
        StringBuilder exceptionSb = new StringBuilder();
        while ((str = fr.readLine()) != null) {
            exceptionSb.append(str);
            exceptionSb.append("\n");
        }
        return exceptionSb.toString();
    }
}
